<!DOCTYPE html>
<html lang="zh-cn">
<head prefix="og: http://ogp.me/ns#">
  <meta charset="utf-8">
  <title>同步动作及优先级 | Screeps 中文文档</title>
  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- Canonical links -->
  <link rel="canonical" href="http://screeps-cn.github.io/simultaneous-actions.html">
  <!-- Alternative links -->
  
    
      <link rel="alternative" hreflang="en" href="http://screeps-cn.github.io/simultaneous-actions.html">
    
      <link rel="alternative" hreflang="zh-tw" href="http://screeps-cn.github.io/zh-tw/simultaneous-actions.html">
    
      <link rel="alternative" hreflang="zh-cn" href="http://screeps-cn.github.io/zh-cn/simultaneous-actions.html">
    
      <link rel="alternative" hreflang="ru" href="http://screeps-cn.github.io/ru/simultaneous-actions.html">
    
      <link rel="alternative" hreflang="ko" href="http://screeps-cn.github.io/ko/simultaneous-actions.html">
    
  
  <!-- Icon -->
  <link rel="apple-touch-icon" sizes="57x57" href="/icon/apple-touch-icon-57x57.png">
  <link rel="apple-touch-icon" sizes="114x114" href="/icon/apple-touch-icon-114x114.png">
  <link rel="apple-touch-icon" sizes="72x72" href="/icon/apple-touch-icon-72x72.png">
  <link rel="apple-touch-icon" sizes="144x144" href="/icon/apple-touch-icon-144x144.png">
  <link rel="apple-touch-icon" sizes="60x60" href="/icon/apple-touch-icon-60x60.png">
  <link rel="apple-touch-icon" sizes="120x120" href="/icon/apple-touch-icon-120x120.png">
  <link rel="apple-touch-icon" sizes="76x76" href="/icon/apple-touch-icon-76x76.png">
  <link rel="apple-touch-icon" sizes="152x152" href="/icon/apple-touch-icon-152x152.png">
  <link rel="icon" type="image/png" href="/icon/favicon-196x196.png" sizes="196x196">
  <link rel="icon" type="image/png" href="/icon/favicon-160x160.png" sizes="160x160">
  <link rel="icon" type="image/png" href="/icon/favicon-96x96.png" sizes="96x96">
  <link rel="icon" type="image/png" href="/icon/favicon-16x16.png" sizes="16x16">
  <link rel="icon" type="image/png" href="/icon/favicon-32x32.png" sizes="32x32">
  <meta name="msapplication-TileColor" content="#2f83cd">
  <meta name="msapplication-TileImage" content="/icon/mstile-144x144.png">
  <!-- CSS -->
  <!-- build:css build/css/navy.css -->
  <link rel="stylesheet" href="/css/navy.css?1">
  <link rel="stylesheet" href="/css/prism.css">
  <!-- endbuild -->
  <link href="https://fonts.googleapis.com/css?family=Lato:300,400,700" rel="stylesheet" type="text/css">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css">
  <!-- RSS -->
  <link rel="alternate" href="/atom.xml" title="Screeps 中文文档">
  <!-- Open Graph -->
  <meta name="description" content="译者注：此章所提及所有的“冲突”及“优先级”都是对同一 creep 而言。有关不同 creep 的冲突，参见“结束阶段”。

不同动作的优先级对单一 creep 而言，其身体的构造决定了其所能执行的动作（ action ，及蓝色方块标记的左侧栏条目）。虽说您可以创造一个万金油般的 creep ，但它仍不能在同一 tick 中执行所有的动作。下图便是各个动作之间的优先级关联：

如过您尝试在同一 t">
<meta property="og:type" content="website">
<meta property="og:title" content="同步动作及优先级">
<meta property="og:url" content="http://screeps-cn.github.io/simultaneous-actions.html">
<meta property="og:site_name" content="Screeps 中文文档">
<meta property="og:description" content="译者注：此章所提及所有的“冲突”及“优先级”都是对同一 creep 而言。有关不同 creep 的冲突，参见“结束阶段”。

不同动作的优先级对单一 creep 而言，其身体的构造决定了其所能执行的动作（ action ，及蓝色方块标记的左侧栏条目）。虽说您可以创造一个万金油般的 creep ，但它仍不能在同一 tick 中执行所有的动作。下图便是各个动作之间的优先级关联：

如过您尝试在同一 t">
<meta property="og:image" content="http://screeps-cn.github.io/img/action-priorities.png">
<meta property="og:updated_time" content="2024-09-20T13:38:58.409Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="同步动作及优先级">
<meta name="twitter:description" content="译者注：此章所提及所有的“冲突”及“优先级”都是对同一 creep 而言。有关不同 creep 的冲突，参见“结束阶段”。

不同动作的优先级对单一 creep 而言，其身体的构造决定了其所能执行的动作（ action ，及蓝色方块标记的左侧栏条目）。虽说您可以创造一个万金油般的 creep ，但它仍不能在同一 tick 中执行所有的动作。下图便是各个动作之间的优先级关联：

如过您尝试在同一 t">
<meta name="twitter:image" content="http://screeps-cn.github.io/img/action-priorities.png">
  <!-- Google Analytics -->
  
</head>

<body>
  <div id="container">
    <header id="header" class="wrapper">
  <div id="header-inner" class="inner">
    <h1 id="logo-wrap">
      <a href="https://screeps.com" id="logo">Screeps</a>
      <a href="/index.html" id="logo-docs">docs</a>
    </h1>
    <a id="mobile-nav-toggle">
      <span class="mobile-nav-toggle-bar"></span>
      <span class="mobile-nav-toggle-bar"></span>
      <span class="mobile-nav-toggle-bar"></span>
    </a>
    <div id="header-main"></div>
  </div>
</header>

    <div id="content-wrap">
  <div id="content" class="wrapper">
    <div id="content-inner">
      <article class="article-container" itemscope itemtype="http://schema.org/Article">
        <div class="article-inner">
          <div class="article">
            <div class="inner">
              <header class="article-header">
                <h1 class="article-title" itemprop="name" id="top">同步动作及优先级</h1>
                <a href="https://github.com/screeps-cn/docs/edit/master/source/simultaneous-actions.md" class="article-edit-link" title="改进本文"><i class="fa fa-pencil"></i></a>
              </header>
              <div class="article-content" itemprop="articleBody">
                
                <blockquote class="note info"><p><strong>译者注：</strong>此章所提及所有的“冲突”及“优先级”都是对同一 <a href="/creeps.html">creep</a> 而言。有关不同 creep 的冲突，参见<a href="/game-loop.html">“结束阶段”</a>。</p>
</blockquote>
<h2 id="不同动作的优先级" class="article-heading"><a href="#不同动作的优先级" class="headerlink" title="不同动作的优先级"></a>不同动作的优先级<a class="article-anchor" href="#不同动作的优先级" aria-hidden="true"></a></h2><p>对单一 creep 而言，其身体的构造决定了其所能执行的<a href="api/#Creep">动作</a>（ action ，及蓝色方块标记的左侧栏条目）。虽说您可以创造一个万金油般的 creep ，但它仍不能在同一 <a href="/game-loop.html">tick</a> 中执行所有的动作。下图便是各个动作之间的优先级关联：</p>
<p><img src="img/action-priorities.png" alt=""></p>
<p>如过您尝试在同一 tick 内执行多个有优先级冲突的动作，<strong>只有图中更靠右的的会被执行</strong>。然而各动作的返回值并不会因优先级冲突而改变。如果动作本身是合乎情理的，那么它总会返回 <code>OK</code> 。举个例子：</p>
<pre class="highlight undefined tab-undefined "><code>    <span class="token comment" spellcheck="true">// 第一 tick</span>
    creep<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span>constructionSite<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// ERR_NOT_ENOUGH_ENERGY - 报错：能量不足</span>
    creep<span class="token punctuation">.</span><span class="token function">harvest</span><span class="token punctuation">(</span>source<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// OK – 执行成功， creep 收获了能量</span>
    <span class="token comment" spellcheck="true">// 第二 tick</span>
    creep<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span>constructionSite<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// OK – 执行成功</span>
    creep<span class="token punctuation">.</span><span class="token function">harvest</span><span class="token punctuation">(</span>source<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// OK - 虽然返回值也为 OK ，但由于在同一 tick （上一行）里使用了优先级更高的 [`Creep.build()`](api/#Creep.build)</span>
    <span class="token comment" spellcheck="true">//所以 [`Creep.harvest()`](api/#Creep.harvest) 实际上被覆盖了，没有被执行。</span></code></pre><p>虽说如此，但您却能在同一 tick 内执行多个没有优先级冲突的动作。比如说：</p>
<pre class="highlight undefined tab-undefined "><code>    creep<span class="token punctuation">.</span><span class="token function">moveTo</span><span class="token punctuation">(</span>target<span class="token punctuation">)</span><span class="token punctuation">;</span>
    creep<span class="token punctuation">.</span><span class="token function">rangedMassAttack</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    creep<span class="token punctuation">.</span><span class="token function">heal</span><span class="token punctuation">(</span>target<span class="token punctuation">)</span><span class="token punctuation">;</span>
    creep<span class="token punctuation">.</span><span class="token function">transfer</span><span class="token punctuation">(</span>target<span class="token punctuation">,</span> RESOURCE_ENERGY<span class="token punctuation">,</span> amountTransfer<span class="token punctuation">)</span><span class="token punctuation">;</span>
    creep<span class="token punctuation">.</span><span class="token function">drop</span><span class="token punctuation">(</span>amountDrop<span class="token punctuation">,</span> RESOURCE_ENERGY<span class="token punctuation">)</span><span class="token punctuation">;</span>
    creep<span class="token punctuation">.</span><span class="token function">pickup</span><span class="token punctuation">(</span>energy<span class="token punctuation">)</span><span class="token punctuation">;</span>
    creep<span class="token punctuation">.</span><span class="token function">claimController</span><span class="token punctuation">(</span>controller<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>上例的动作无一冲突，都能在同一 tick 中被成功执行。</p>
<p>取决于能量的多少，同时使用多个有关能量传输的动作会导致不同的结果</p>
<ul>
<li>如果能量足够有余，那么所有的所有动作都将会被执行</li>
<li>否则，优先级规则会介入以解决冲突</li>
</ul>
<h2 id="同一动作的优先级" class="article-heading"><a href="#同一动作的优先级" class="headerlink" title="同一动作的优先级"></a>同一动作的优先级<a class="article-anchor" href="#同一动作的优先级" aria-hidden="true"></a></h2><p>值得注意的是，不同动作的执行结果仅和它们之间的优先级有关，与在代码中的的顺序无关。但是对与<strong>相同</strong>的动作，最后一个才会被成功执行。例如在同一 tick 中：</p>
<pre class="highlight undefined tab-undefined "><code>    creep<span class="token punctuation">.</span><span class="token function">moveTo</span><span class="token punctuation">(</span>target<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 被覆盖(因为 [`Creep.moveTo()`](api/#Creep.moveTo) 源码中有调用 [`Creep.move()`](api/#Creep.move))</span>
    creep<span class="token punctuation">.</span><span class="token function">move</span><span class="token punctuation">(</span>RIGHT<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 被覆盖</span>
    creep<span class="token punctuation">.</span><span class="token function">move</span><span class="token punctuation">(</span>LEFT<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 被执行</span></code></pre><p>最终结果是这个 creep 会向左移动一格。</p>
<h2 id="更多" class="article-heading"><a href="#更多" class="headerlink" title="更多"></a>更多<a class="article-anchor" href="#更多" aria-hidden="true"></a></h2><ol>
<li>请注意，治疗一个满血的 creep 或修复满血的建筑会返回 <code>OK</code> 并可能覆盖其他优先级较低的动作。</li>
<li>尽管同时使用 <code>transfer</code> （传出）和 <code>drop</code> （丢弃）并不一定会产生优先级冲突，您却不能同时执行多个 <code>transfer</code>（比如传资源给多个建筑），以此类推。</li>
<li>同时执行需要 <code>CARRY</code> 部件的不同动作不会产生冲突。但资源的存量并没不会在玩家代码执行过程中被改变。参见<a href="/game-loop.html">理解游戏循环、游戏时间、ticks</a></li>
</ol>

              </div>
              <footer class="article-footer">
                <time class="article-footer-updated" datetime="2024-09-20T13:38:58.409Z" itemprop="dateModified">上次更新：9月 20, 2024</time>
                <a href="/commit.html" class="article-footer-prev"><i class="fa fa-chevron-left"></i><span>外部提交</span></a><a href="/cpu-limit.html" class="article-footer-next"><span>CPU 限制</span><i class="fa fa-chevron-right"></i></a>
              </footer>
            </div>
          </div>
          <aside id="article-toc" role="navigation">
            
            <div id="article-toc-inner">
              <strong class="sidebar-title">目录</strong>
              <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#不同动作的优先级"><span class="toc-text">不同动作的优先级</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#同一动作的优先级"><span class="toc-text">同一动作的优先级</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#更多"><span class="toc-text">更多</span></a></li></ol>
              <a href="#" id="article-toc-top">回到顶部</a>
            </div>
            
          </aside>
        </div>
      </article>
      <aside id="sidebar" role="navigation">
  <div class="inner"><a href="/api/" class=api-link><span>API Reference</span><img src="/img/link-external.svg"></a><a href="/index.html" class="sidebar-link">总览</a><strong class="sidebar-title">游戏环境</strong><a href="/introduction.html" class="sidebar-link">简介</a><a href="/creeps.html" class="sidebar-link">Creeps</a><a href="/control.html" class="sidebar-link">控制</a><a href="/defense.html" class="sidebar-link">防御</a><a href="/respawn.html" class="sidebar-link">重生</a><a href="/start-areas.html" class="sidebar-link">初始区域</a><a href="/resources.html" class="sidebar-link">资源</a><a href="/market.html" class="sidebar-link">市场</a><a href="/invaders.html" class="sidebar-link">NPC 入侵者</a><a href="/power.html" class="sidebar-link">超能</a><strong class="sidebar-title">脚本</strong><a href="/scripting-basics.html" class="sidebar-link">脚本基础</a><a href="/global-objects.html" class="sidebar-link">全局对象</a><a href="/modules.html" class="sidebar-link">模块</a><a href="/debugging.html" class="sidebar-link">调试</a><a href="/game-loop.html" class="sidebar-link">游戏循环</a><a href="/commit.html" class="sidebar-link">外部提交</a><a href="/simultaneous-actions.html" class="sidebar-link current">同步操作</a><a href="/cpu-limit.html" class="sidebar-link">CPU 限制</a><strong class="sidebar-title">其他</strong><a href="/architecture.html" class="sidebar-link">服务器架构</a><a href="/ptr.html" class="sidebar-link">公开测试区域 (PTR)</a><a href="/third-party.html" class="sidebar-link">第三方工具</a><a href="/auth-tokens.html" class="sidebar-link">验证令牌</a><a href="/community-servers.html" class="sidebar-link">社区服务器</a><a href="/tos.html" class="sidebar-link">服务条款</a><a href="/privacy-policy.html" class="sidebar-link">隐私政策</a><strong class="sidebar-title">资源</strong><a href="http://blog.screeps.com" class="sidebar-link">博客</a><a href="http://blog.screeps.com/categories/Changelogs/" class="sidebar-link">修改日志</a><a href="http://chat.screeps.com" class="sidebar-link">聊天室</a><a href="https://screeps.com/forum/" class="sidebar-link">论坛</a><strong class="sidebar-title">贡献文章</strong><a href="/contributed/rules.html" class="sidebar-link">贡献规则</a><a href="/contributed/advanced_grunt.html" class="sidebar-link">高级 Grunt 使用</a><a href="/contributed/modifying-prototypes.html" class="sidebar-link">修改原型</a><a href="/contributed/caching-overview.html" class="sidebar-link">缓存概述</a><a href="/contributed/ps_ubuntu.html" class="sidebar-link">私有服务器 MongoDB</a></div>
</aside>
    </div>
  </div>
</div>

    <footer id="footer" class="wrapper">
  <div class="inner">
    <div id="footer-copyright">
      &copy; 2024 <a href="https://screeps.com/" target="_blank">Screeps</a><br>
      Documentation licensed under <a href="http://creativecommons.org/licenses/by/4.0/" target="_blank">CC BY 4.0</a>.
    </div>
    <div id="footer-links">
      <a href="https://github.com/screeps-cn/docs" class="footer-link" target="_blank"><i class="fa fa-github-alt"></i></a>
    </div>
  </div>
</footer>

  </div>
  <div id="mobile-nav-dimmer"></div>
  <nav id="mobile-nav">
  <div id="mobile-nav-inner">
    
      <a href="/api/" class=api-link><span>API Reference</span><img src="/img/link-external.svg"></a><a href="/index.html" class="mobile-nav-link">总览</a><strong class="mobile-nav-title">游戏环境</strong><a href="/introduction.html" class="mobile-nav-link">简介</a><a href="/creeps.html" class="mobile-nav-link">Creeps</a><a href="/control.html" class="mobile-nav-link">控制</a><a href="/defense.html" class="mobile-nav-link">防御</a><a href="/respawn.html" class="mobile-nav-link">重生</a><a href="/start-areas.html" class="mobile-nav-link">初始区域</a><a href="/resources.html" class="mobile-nav-link">资源</a><a href="/market.html" class="mobile-nav-link">市场</a><a href="/invaders.html" class="mobile-nav-link">NPC 入侵者</a><a href="/power.html" class="mobile-nav-link">超能</a><strong class="mobile-nav-title">脚本</strong><a href="/scripting-basics.html" class="mobile-nav-link">脚本基础</a><a href="/global-objects.html" class="mobile-nav-link">全局对象</a><a href="/modules.html" class="mobile-nav-link">模块</a><a href="/debugging.html" class="mobile-nav-link">调试</a><a href="/game-loop.html" class="mobile-nav-link">游戏循环</a><a href="/commit.html" class="mobile-nav-link">外部提交</a><a href="/simultaneous-actions.html" class="mobile-nav-link current">同步操作</a><a href="/cpu-limit.html" class="mobile-nav-link">CPU 限制</a><strong class="mobile-nav-title">其他</strong><a href="/architecture.html" class="mobile-nav-link">服务器架构</a><a href="/ptr.html" class="mobile-nav-link">公开测试区域 (PTR)</a><a href="/third-party.html" class="mobile-nav-link">第三方工具</a><a href="/auth-tokens.html" class="mobile-nav-link">验证令牌</a><a href="/community-servers.html" class="mobile-nav-link">社区服务器</a><a href="/tos.html" class="mobile-nav-link">服务条款</a><a href="/privacy-policy.html" class="mobile-nav-link">隐私政策</a><strong class="mobile-nav-title">资源</strong><a href="http://blog.screeps.com" class="mobile-nav-link">博客</a><a href="http://blog.screeps.com/categories/Changelogs/" class="mobile-nav-link">修改日志</a><a href="http://chat.screeps.com" class="mobile-nav-link">聊天室</a><a href="https://screeps.com/forum/" class="mobile-nav-link">论坛</a><strong class="mobile-nav-title">贡献文章</strong><a href="/contributed/rules.html" class="mobile-nav-link">贡献规则</a><a href="/contributed/advanced_grunt.html" class="mobile-nav-link">高级 Grunt 使用</a><a href="/contributed/modifying-prototypes.html" class="mobile-nav-link">修改原型</a><a href="/contributed/caching-overview.html" class="mobile-nav-link">缓存概述</a><a href="/contributed/ps_ubuntu.html" class="mobile-nav-link">私有服务器 MongoDB</a>
    
  </div>
</nav>
  <!-- Scripts -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<!-- build:js build/js/main.js -->
<script src="/js/lang_select.js"></script>
<script src="/js/scrollingelement.js"></script>
<script src="/js/toc.js"></script>
<script src="/js/mobile_nav.js"></script>
<script src="/js/custom.js"></script>
<!-- endbuild -->
<script src="https://cdn.jsdelivr.net/retinajs/1.3.0/retina.min.js" async></script>

<!-- Algolia -->

</body>
</html>